﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace 文件内容队列读写
{
    /// <summary>
    /// 多个不同的数据库文件读写测试.xaml 的交互逻辑
    /// </summary>
    public partial class 多个不同的数据库文件读写测试 : Page
    {
        public 多个不同的数据库文件读写测试()
        {
            InitializeComponent();
            
        }
        //终端数据逻辑
        TerminalDbDataLogic logic = new TerminalDbDataLogic();

        public TerminalDbDataLogic Logic
        {
            get { return logic; }
        }


        public void Start()
        {
            logic.Init();
            logic.Collection.ToList().ForEach((o) =>
            {
                o.Value.BeginDB();
                Console.WriteLine("开始DB 编号:" + o.Key);
            });
        }
        /// <summary>
        /// 开始n个文件读写测试
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (logic.暂停运行)
            {
                logic.暂停运行 = false;
                return;
            }

            //1.1个线程写数据
            //2.一个线程不停的提交事务,打开新事务
            //3.一个线程不停的读取数据,删除数据.
            //4.同时批量操作100个数据库看看效果
            int dbnum = int.Parse(tt.Text);
            Action act = () =>
            {
                System.Linq.Enumerable.Range(1, dbnum).ToList().ForEach(o =>
                    logic.Collection.TryAdd(o + string.Empty, new TerminalDbData("./Datas/" + o + ".db") { TerminalFlag = o + string.Empty })
                    );
            };

            long time = act.StopwatchRun();
            Console.WriteLine("创建{0}个库对像用时:{1}毫秒,{2:f2}/s", dbnum, time,time/1000.0);

            Task.Factory.StartNew(() => { })
               .ContinueWith((t) =>
               {
                   Action c = Start;
                   long time1 = c.StopwatchRun();
                   Console.WriteLine("开始所有库对像用时:{0}毫秒,{1:f2}/s", time1,time1/1000.0);
               })
               .ContinueWith((t) =>
               {
                   Task.Factory.StartNew(模拟接收_写数据);
                   Task.Factory.StartNew(() => { while (true) { Read(); } });
                   Task.Factory.StartNew(模拟读_发数据);
               })
               ;


        }

        /// <summary>
        /// 停止测试
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            logic.暂停运行 = true;
            Console.WriteLine("已经暂停运行");
        }



        string receiveHex = "7E030800FF0841414141414141411A005E9798001505201409498703C200374134443039434146424132354133383330303732333644393532303034314214008FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E4002170081116683813000039901346000F5007F00C800D1DD0000010A0011000010110010000000AF7E7E030800FF0841414141414141411A005E9798001505201409498703C200374134443039434146424132354133383330303732333644393532303034314214008FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E408FC2F5285C8F0E4002170081116683813000039901346000F5007F00C800D1DD0000010A0011000010110010000000AF7E";
        void 模拟接收_写数据()
        {
            //模拟1秒10条数据
            while (true)
            {
                ddd();
                System.Threading.Thread.Sleep(70);
            }
        }

        public void ddd()
        {
            logic.Collection.ToList().ForEach((o) =>
            {
                //数据库是否可操作
                if (!o.Value.CanOperation) { return; }
                string sql = string.Format("INSERT INTO TerminalData (数据,终端号,写入时间) VALUES ( '{0}','{1}','{2}')",
receiveHex,
  o.Key,
DateTime.Now
);
                o.Value.WriteQueue.Enqueue(sql);
            });
        }
        string delsql = "delete from TerminalData where id={0}";
        void 模拟读_发数据()
        {
            //模拟1秒8条数据
            while (true)
            {
                ccc();
                System.Threading.Thread.Sleep(1000);
            }
        }

        /// <summary>
        /// 定时读取数据,用于填充读缓冲区
        /// </summary>
        private void Read()
        {
            //读数据
            logic.Reader();
            System.Threading.Thread.Sleep(1000);
        }
        public void ccc()
        {
            logic.Collection.ToList().ForEach((o) =>
            {

                //数据库是否可操作
                if (!o.Value.CanOperation) { return; }
                文件内容队列读写.DataQueue.TerminalData outx;
              while(o.Value.ReaderQueue.TryDequeue(out outx))
                {
                    //写入到需要删除的数据中
                    //模拟发送数据
                    //模拟收到数据回应_删除数据
                    o.Value.DelQueue.Enqueue(string.Format(delsql, outx.ID));
                }
            });
        }






    }

    /// <summary>
    /// 逻辑处理
    /// </summary>
    public class 批量数据库文件操作
    {

    }

}
